package finance

import (
	"beegoProject15/models/finance"
	"beegoProject15/utils"
	"fmt"
	"github.com/360EntSecGroup-Skylar/excelize"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/orm"
	"math"
	"strconv"
	"time"
)

type FinanceEchartsDataController struct {
	beego.Controller
}

func (c *FinanceEchartsDataController) Get() {

	// 1 财务中心需要显示所有数据
	o := orm.NewOrm()
	qs := o.QueryTable("sys_finance_data")

	/*
		2 分页模块
	*/
	// 每页显示数据 (pagePerNum)
	pagePerNum := 8

	// 当前页 (currentPage)
	currentPage, err := c.GetInt("page")
	// err 当点击页面时候没有获取到当前页也就是null，所以默认显示第一页
	if err != nil {
		currentPage = 1
	}

	offsetNum := pagePerNum * (currentPage - 1)

	var count int64 = 0
	financeData := []finance.FinanceData{}

	// 获取日期
	month := c.GetString("month")

	// 判断是否获取到month
	if month != "" {

		// 根据用户输入查询
		count, _ = qs.Filter("finance_date", month).Count()
		qs.Filter("finance_date", month).Limit(pagePerNum).Offset(offsetNum).All(&financeData)

	} else {

		// 未获取前端输入month则显示所有
		month = time.Now().Format("2006-01")

		// 用户未输入则默认显示当月
		count, _ = qs.Filter("finance_date", month).Count()
		qs.Filter("finance_date", month).Limit(pagePerNum).Offset(offsetNum).All(&financeData)
	}

	// 总页数 (count) =  总数据量 / 每页数据量   注：需要转换成int类型
	countPage := int(math.Ceil(float64(count) / float64(pagePerNum)))

	// 判断上一页
	prePage := 1
	if currentPage == 1 {
		prePage = currentPage
	} else if currentPage > 1 {
		// 上一页
		prePage = currentPage - 1
	}

	// 下一页
	nextPage := 1
	// 如果当前页小于总页数
	if currentPage < countPage {
		// 下一页 就等于 当前页+1
		nextPage = currentPage + 1
		// 如果当前页面大于等于总页数
	} else if currentPage >= countPage {
		// 下一页 就等于 当前页
		nextPage = currentPage
	}

	// 引用倒入到函数page.go
	pageMap := utils.Paginator(currentPage, pagePerNum, count)

	// 4 输出数据
	c.Data["prePage"] = prePage         /* 上一页*/
	c.Data["nextPage"] = nextPage       /* 下一页 */
	c.Data["currentPage"] = currentPage /* 当前页 */
	c.Data["countPage"] = countPage     /* 总页数 */
	c.Data["count"] = count             /* 总数据量 */
	c.Data["page_map"] = pageMap
	c.Data["finance_data"] = financeData
	c.Data["month"] = month

	c.TplName = "finance/echarts-data-list.html"
}

func (c *FinanceEchartsDataController) ToImportExcel() {

	// 用户点击excel导入按钮进入导入页面
	c.TplName = "finance/echart-data-import.html"

}

func (c *FinanceEchartsDataController) DoImportExcel() {

	// 1 获取前端文件
	file, fileHeader, err := c.GetFile("upload_file")

	// 4 定义前端返回
	messageMap := map[string]interface{}{}

	// 16-2. 精确到导入失败的数据信息提示 - 存放错误
	errDataArr := []string{}

	// 2 关闭文件
	defer func() {
		file.Close()
	}()

	// 3 判断文件获取是否正航
	if err != nil {
		messageMap["code"] = 10001
		messageMap["msg"] = "文件上传失败"
		c.Data["json"] = messageMap
		c.ServeJSON()
	}

	// 5 获取文件
	fileName := fileHeader.Filename

	// 6 按照日期定义时间戳
	timeUnixInt := time.Now().Unix()
	timeUnixStr := strconv.FormatInt(timeUnixInt, 10) // 10进制

	// 7 定义存储路径
	filePath := "upload/echarts_data_upload/" + timeUnixStr + "_" + fileName

	// 8 保存文件到存储路径
	c.SaveToFile("upload_file", filePath)

	// 10 读取数据并插入数据库
	// 导入包方法 go get github.com/360EntSecGroup-Skylar/excelize
	f, err1 := excelize.OpenFile(filePath) // 读取路径
	logs.Error(err1)

	rows := f.GetRows("Sheet1") //需要读取的Sheet页

	// 13 定义数据库（一次准备，多次插入）
	o := orm.NewOrm()

	// 12 计数器 第一列标题不要读入
	i := 0

	// 16-1 重复导入相同月份的数据：
	// 获取当前月份
	month := time.Now().Format("2006-01")
	// 先删除已有的工资月份，再导入
	qs := o.QueryTable("sys_finance_data")
	isExist := qs.Filter("finance_date", month).Exist()
	fmt.Println("isExist", isExist)
	if isExist {
		qs.Filter("finance_date", month).Delete()
	}

	// 11 循环读取每一列
	for _, row := range rows {
		if i == 0 {
			i++
			continue
		}
		// 获取rows内的列
		financeDate := row[0]
		salesVolume, _ := strconv.ParseFloat(row[1], 64)
		studentIncrease := utils.StrToInt(row[2])
		django := utils.StrToInt(row[3])
		vueDjango := utils.StrToInt(row[4])
		celery := utils.StrToInt(row[5])

		// 14 初始化结构体对象
		echartsData := finance.FinanceData{
			FinanceDate:     financeDate,
			SalesVolume:     salesVolume,
			StudentIncrease: studentIncrease,
			Django:          django,
			VueDjango:       vueDjango,
			Celery:          celery,
		}

		// 15 逐条插入（数据全部正常）
		_, err = o.Insert(&echartsData)
		// 16-2 导入错误信息
		if err != nil {
			errDataArr = append(errDataArr, strconv.Itoa(echartsData.Id)) // 若导入报错，则将cardId传入错误信息
		}

	}
	// 16-2
	if len(errDataArr) <= 0 {
		messageMap["code"] = 200
		messageMap["msg"] = "导入成功"
	} else {
		messageMap["code"] = 10002
		messageMap["msg"] = "导入失败"
		messageMap["err_data"] = errDataArr
	}

	// 9 前端返回
	/*messageMap["code"] = 200
	messageMap["msg"] = "导入成功"*/
	c.Data["json"] = messageMap
	c.ServeJSON()

	/* 16 问题：
	   1. 重复导入相同月份的数据
	   2. 精确到导入失败的数据信息提示
	*/

}
